package org.JWCB.system.service.exam;

import org.JWCB.common.core.domain.vo.R;
import org.JWCB.system.domain.exam.dto.ExamAddDto;
import org.JWCB.system.domain.exam.dto.ExamEditDto;
import org.JWCB.system.domain.exam.dto.ExamQueryDto;
import org.JWCB.system.domain.exam.dto.ExamQuestionAddDto;
import org.JWCB.system.domain.exam.entity.Exam;
import org.JWCB.system.domain.exam.vo.ExamDetailVo;
import org.JWCB.system.domain.exam.vo.ExamListItemVo;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;

public interface IExamService {

    /**
     * 查询竞赛数据
     * @param examQueryDto 查询条件
     * @return 竞赛列表
     */
     List<ExamListItemVo> list(ExamQueryDto examQueryDto);


    /**
     * 添加竞赛
     * @param examAddDto 竞赛数据
     * @return 添加成功(带上examId) or 失败
     */
     R<String> add(ExamAddDto examAddDto);


    /**
     * 为竞赛添加题目
     * @param examQuestionAddDto 题目信息
     * @return 是否添加成功
     */
     boolean addQuestion(ExamQuestionAddDto examQuestionAddDto);


    /**
     * 保存到数据库
     * @param questionIdSet 问题ids
     * @param exam 竞赛信息
     * @return 保存成功 or 失败
     */
     boolean saveExamQuestion(Set<Long> questionIdSet, Exam exam, Integer oldQuestionSize);


    /**
     * 更改题目数据
     * @param examQuestionAddDto 新的题目数据id数据
     * @return 成功/失败
     */

     boolean updateQuestionOrder(ExamQuestionAddDto examQuestionAddDto);


    /**
     * 根据竞赛id得到竞赛详情
     * @param examId 竞赛id
     * @return 竞赛详情
     */
    ExamDetailVo examDetail(Long examId);


    /**
     * 编辑竞赛基本信息
     * @param examEditDto 竞赛基本信息
     * @return 成功 or 失败
     */
     int edit(ExamEditDto examEditDto);

    /**
     * 删除竞赛中的题目
     * @param examId 竞赛id
     * @param questionId 问题id
     * @return 成功 or 失败
     */
     int delQuestion(Long examId, Long questionId);

    /**
     * 删除竞赛
     * @param examId 竞赛id
     * @return 成功 or 失败
     */
    public int del(Long examId);


    /**
     * 发布竞赛
     * @param examId 竞赛id
     * @return 成功 or 失败
     */
     int publish(Long examId);


    /**
     * 竞赛撤销发布
     * @param examId 竞赛id
     * @return 成功 or 失败
     */
    int unpublish(Long examId);
}
